Find right interval¶
Time: O(NLogN); Space: O(N); medium
You are given an array of intervals, where intervals[i] = [starti, endi] and each starti is unique.
The right interval for an interval i is an interval j such that startj >= endi and startj is minimized.
Return an array of right interval indices for each interval i. If no right interval exists for interval i, then put -1 at index i.
Example 1:
Input: intervals = [Interval(1,2)]
Output: [-1]
Explanation:
There is only one interval in the collection, so it outputs -1.
Example 2:
Input: intervals = [Interval(3,4),Interval(2,3),Interval(1,2)]
Output: [-1,0,1]
Explanation:
There is no right interval for [3,4].
The right interval for [2,3] is [3,4] since start0 = 3 is the smallest start that is >= end1 = 3.
The right interval for [1,2] is [2,3] since start1 = 2 is the smallest start that is >= end2 = 2.
Example 3:
Input: intervals = [Interval(1,4),Interval(2,3),Interval(3,4)]
Output: [-1,2,-1]
Explanation:
There is no right interval for [1,4] and [3,4].
The right interval for [2,3] is [3,4] since start2 = 3 is the smallest start that is >= end1 = 3.
Constraints:
1 <= len(intervals) <= 2 * 104
len(intervals[i]) = 2
-106 <= starti <= endi <= 106
The start point of each interval is unique.
[3]:
class Interval(object):
def __init__(self, s=0, e=0):
self.start = s
self.end = e
1. Binary Search [O(NLogN), O(1)]¶
[4]:
import bisect
class Solution1(object):
"""
Time: O(NLogN)
Space: O(N)
"""
def findRightInterval(self, intervals):
"""
:type intervals: List[Interval]
:rtype: List[int]
"""
sorted_intervals = sorted((interval.start, i) for i, interval in enumerate(intervals))
result = []
for interval in intervals:
idx = bisect.bisect_left(sorted_intervals, (interval.end,))
result.append(sorted_intervals[idx][1] if idx < len(sorted_intervals) else -1)
return result
[5]:
s = Solution1()
intervals = [Interval(1,2)]
assert s.findRightInterval(intervals) == [-1]
intervals = [Interval(3,4),Interval(2,3),Interval(1,2)]
assert s.findRightInterval(intervals) == [-1,0,1]
intervals = [Interval(1,4),Interval(2,3),Interval(3,4)]
assert s.findRightInterval(intervals) == [-1,2,-1]
See also:¶
https://leetcode.com/problems/find-right-interval
https://www.lintcode.com/problem/find-right-interval/description
Related problems:¶
https://leetcode.com/problems/data-stream-as-disjoint-intervals/